package controller

import (
	"context"
	"mldong/api/base"
	userApi "mldong/api/user"
	"mldong/internal/modules/sys/logic"
	"mldong/internal/modules/sys/service"

	"mldong/utility"

	"github.com/gogf/gf/v2/frame/g"
)

func init() {
	// 注册控制器时自动注入依赖
	utility.RegisterController(&UserController{
		// userService: utility.MustResolve(service.UserServiceType).(service.IUserService),
		// 控制层使用强依赖logic的方式，保证逻辑层的init方法比controller的方法先执行
		userService: utility.MustResolve(service.UserServiceType).(*logic.UserLogic),
	})
}

type UserController struct {
	userService service.IUserService
}

// 保存用户
func (ctrl *UserController) Save(ctx context.Context, req *userApi.SaveReq) (res *base.CommonResult, err error) {
	success, err := ctrl.userService.Save(ctx, req)
	if err != nil {
		return
	}
	if success {
		jsonData := base.Ok()
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	} else {
		jsonData := base.FailWithDefaultCode("保存用户失败")
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	}
	return
}

// 修改用户
func (ctrl *UserController) Update(ctx context.Context, req *userApi.UpdateReq) (res *base.CommonResult, err error) {
	success, err := ctrl.userService.Update(ctx, req)
	if err != nil {
		return
	}
	if success {
		jsonData := base.Ok()
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	} else {
		jsonData := base.FailWithDefaultCode("修改用户失败")
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	}
	return
}

// 删除用户
func (ctrl *UserController) Remove(ctx context.Context, req *userApi.RemoveReq) (res *base.CommonResult, err error) {
	success, err := ctrl.userService.Remove(ctx, req.Ids)
	if err != nil {
		return
	}
	if success {
		jsonData := base.Ok()
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	} else {
		jsonData := base.FailWithDefaultCode("删除用户失败")
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	}
	return
}

// 获取用户详情
func (ctrl *UserController) Detail(ctx context.Context, req *userApi.DetailReq) (res *userApi.DetailRes, err error) {
	// 设置 JSON 数据
	jsonData, err := ctrl.userService.Detail(ctx, req.ID)
	if err != nil {
		return
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))
	return
}

// 分页查询用户列表
func (ctrl *UserController) Page(ctx context.Context, req *userApi.PageReq) (res *userApi.PageRes, err error) {
	jsonData, err := ctrl.userService.Page(ctx, req)
	if err != nil {
		return
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))
	return
}

// 重新用户密码
func (ctrl *UserController) ResetPassword(ctx context.Context, req *userApi.ResetPasswordReq) (res *base.CommonResult, err error) {
	success, err := ctrl.userService.ResetPassword(ctx, req.Ids)
	if err != nil {
		return
	}
	if success {
		jsonData := base.Ok()
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	} else {
		jsonData := base.FailWithDefaultCode("重置密码失败")
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	}
	return
}

// 个人-用户信息
func (ctrl *UserController) Info(ctx context.Context, req *userApi.InfoReq) (res *userApi.DetailRes, err error) {
	// 从请求上下文中获取userId
	userId := utility.GetCurrentUserId(ctx)
	jsonData, err := ctrl.userService.Detail(ctx, userId)
	if err != nil {
		return
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))
	return
}

// 个人-权限标识
func (ctrl *UserController) PermCode(ctx context.Context, req *userApi.PermCodeReq) (res *userApi.PermCodeRes, err error) {
	// 从请求上下文中获取userId
	userId := utility.GetCurrentUserId(ctx)
	jsonData, err := ctrl.userService.PermCode(ctx, userId)
	if err != nil {
		return
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))
	return
}
